package ar.edu.isft189.controller;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import ar.edu.isft189.dao.GeneralCrudDao;
import ar.edu.isft189.model.Entidad;
import ar.edu.isft189.model.Usuario;

public class CRUDGeneral extends HttpServlet {
	private static final long serialVersionUID = 1L;
	private GeneralCrudDao dao;
	private List<Entidad> lstEnt;

	public CRUDGeneral() {
		dao = new GeneralCrudDao();
	}

	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {

	}

	protected void doPost(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {

		if (request.getParameter("action") != null) {

			String action = (String) request.getParameter("action");
			response.setContentType("application/json");

			switch (action) {
			case "listDocentesLabel":
				listDocentesLabel(request, response);
				break;
			case "login":
				login(request, response);
				break;
			case "listMateriasLabel":
				listMateriasLabel(request, response);
				break;
			default:
				String error = "{\"Result\":\"ERROR\",\"Message\": Action no Existente}";
				response.getWriter().print(error);
				break;
			}
		}
	}

	/**
	 * Metodo que recibe una lista de Entodades y devuelve un string con el
	 * formato Json para que se pueda cargar un combo
	 * 
	 * @author David
	 * 
	 * @param lista
	 * @return String
	 */
	private String processListToJsonOption(List<Entidad> lista) {

		String select = "";
		for (Entidad obj : lista) {
			select = select + "{\"DisplayText\":\"" + obj.getDesc()
					+ "\",\"Value\":\"" + obj.getId() + "\"},";
		}

		select = select.substring(0, select.lastIndexOf(","));
		return select;
	}

	/**
	 * Metodo que devuelve el label de los Docentes para mostrarlos en un combo
	 * 
	 * @author David
	 * 
	 * @param request
	 * @param response
	 * @throws IOException
	 */
	private void listDocentesLabel(HttpServletRequest request,
			HttpServletResponse response) throws IOException {

		lstEnt = new ArrayList<Entidad>();

		try {
			// Obtengo la lista de Mesas
			lstEnt = dao.getDocentesLabel();
			// Lo convierto para ser usado en el combo
			String select = processListToJsonOption(lstEnt);

			String listData;
			// Return Json in the format required by jTable plugin
			listData = "{\"Result\":\"OK\",\"Options\":[" + select + "]}";
			System.out.println("Json " + listData);
			response.getWriter().print(listData);

		} catch (Exception ex) {
			String error = "{\"Result\":\"ERROR\",\"Message\":"
					+ ex.getMessage() + "}";
			response.getWriter().print(error);
			System.out.println("Json " + error);
			ex.printStackTrace();
		}
	}

	/**
	 * Metodo que devuelve el listado de las materias como label para mostrarlas 
	 * en un combo
	 * 
	 * @author David
	 * 
	 * @param request
	 * @param response
	 * @throws IOException
	 */
	private void listMateriasLabel(HttpServletRequest request,
			HttpServletResponse response) throws IOException {

		lstEnt = new ArrayList<Entidad>();

		try {
			// Obtengo todas las Materias
			lstEnt = dao.getMateriasLabel();
			// Lo convierto para ser usado en el combo
			String select = processListToJsonOption(lstEnt);

			String listData;
			// Return Json in the format required by jTable plugin
			listData = "{\"Result\":\"OK\",\"Options\":[" + select + "]}";
			System.out.println("Json " + listData);
			response.getWriter().print(listData);

		} catch (Exception ex) {
			String error = "{\"Result\":\"ERROR\",\"Message\":"
					+ ex.getMessage() + "}";
			response.getWriter().print(error);
			System.out.println("Json " + error);
			ex.printStackTrace();
		}
	}

	/**
	 * Metodo que obtiene los datos de la base de datos del usuario que 
	 * se loguea a la aplicacion y guarda los datos en el request
	 * 
	 * @author David 
	 * 
	 * @param request
	 * @param response
	 * @throws IOException
	 */
	private void login(HttpServletRequest request, HttpServletResponse response)
			throws IOException {

		try {
			String usr = request.getParameter("user").toString();
			String psw = request.getParameter("psw").toString();
			// Invocacion al DAO LOGIN para obtener los datos del
			// usuario que se logueo
			Usuario u = dao.login(usr, psw);

			if (u != null) {
				if (isLogin(u)) {
					// Guardo los datos de usuario en la session
					request.getSession().setAttribute("usuario", u);
					request.getSession().setAttribute("perfil", u.getPerfil());

					String json = "{\"Result\":\"OK\"}";
					System.out.println("Json " + json);
					response.getWriter().print(json);
				} else {
					// Si no existe el usuario
					String error = "{\"Result\":\"ERROR\",\"Message\": \"El Usuario o la Clave son Erroneas\"}";
					response.getWriter().print(error);
				}
			} else {
				String error = "{\"Result\":\"ERROR\",\"Message\": \"No se pudo conectar con el servidor\"}";
				response.getWriter().print(error);
			}

		} catch (Exception ex) {
			String error = "{\"Result\":\"ERROR\",\"Message\": \" Error en login\"}";
			response.getWriter().print(error);
			System.out.println("Json " + error);
			ex.printStackTrace();
		}
	}

	/**
	 * Metodo que retorna si usuario viene vacio o no
	 * 
	 * @author David
	 * 
	 * @param u
	 * @return boolean
	 */
	private boolean isLogin(Usuario u) {

		if (u.getLegajo() == 0L && u.getPerfil() == 0
				&& u.getApenom().isEmpty()) {
			return false;
		} else {
			return true;
		}
	}
}